*********************************** * Schnelle Linienroutine * * Assembler: ATMAS-II * * Peter Finzel 1987 *********************************** * * IOCB-Struktur, CIO-Befehle... * ICCOM EQU $342 ICBAL EQU $344 ICBAH EQU $345 ICAX1 EQU $34A ICAX2 EQU $34B CIOV EQU $E456 CIO-Vektor COPEN EQU 3 CCLSE EQU 12 * * Betriebssystem-Variable * SAVMSC EQU $58 Bildschirm-Adresse * * Konstante fuer GRAPHICS 6 * YMAX EQU 96 Aufloesung vert. XMAX EQU 160 Aufloesung hor. ZLAENGE EQU 20 Bytes pro Zeile * * Zeropage-Variable * XNEU EQU $E0 (Byte) Endpunkt X YNEU EQU $E1 (Byte) Endpunkt Y XALT EQU $E2 (Byte) Startpunkt X YALT EQU $E3 (Byte) Startpunkt Y ZAEHLER EQU $E4 (Byte) Pixelzaehler DELTAX EQU $E5 (Byte) Abstand X DELTAY EQU $E6 (Byte) Abstand Y XFLAG EQU $E7 (Byte) Merker links/rechts YFLAG EQU $E8 (Byte) Merker oben/unten HILFA EQU $E9 (Word) Hilfsregister HILFB EQU $EB (Word) fuer Naeherung HILFT EQU $ED (Word) ZEIGER EQU $EF (Word) Vektor f. Plot * * Zwei Makros fuer 16-Bit Zahlen... * ADD MACRO P1,P2 CLC LDA P2 ADC P1 STA P2 LDA P2+1 ADC P1+1 STA P2+1 MEND SUB MACRO P1,P2,P3 SEC LDA P1 SBC P2 STA P3 LDA P1+1 SBC #0 STA P3+1 MEND * ORG $A800 im res. Bereich *********************************** * Demo-Programm 'Hilights' *********************************** * * GRAPHICS 6+16 * LDA #6+16 GRAPHICS 7 JSR GRAPHICS ganzen Screen JSR PLOTAB Tabellen... DEMO LDA #0 Linienstart STA XSTART DEMO2 LDA #160 Linienende STA XENDE DEMO1 LDA XSTART Anfangspunkt STA XALT setzen (X & Y) LDA #0 STA YALT LDX XENDE Endpunkt setzen LDY #95 JSR DRAWTO Linie zeichnen SEC neue Koordinaten LDA XENDE berechnen SBC #20 STA XENDE BNE DEMO1 CLC LDA XSTART Startpunkt ADC #39 STA XSTART CMP #160 BCC DEMO2 JMP DEMO Endloses Demo * * Variablen Demoprogramm * XSTART DFB 0 XENDE DFB 0 * ************************************* * Schnelle Berechnung von Linien * * Parameter: XALT,YALT: Startpunkt * , : Endpunkt ************************************* * DRAWTO STX XNEU Endpunkt merken STY YNEU LDX XALT Anfangspunkt LDY YALT zeichnen JSR PLOT LDA #0 Flags ruecksetzen STA XFLAG STA YFLAG LDX XNEU Endpunkt in Register LDY YNEU (einfacher) CPX XALT Anfang = Ende? BNE DR1 CPY YALT BNE DR1 RTS ja fertig!==> DR1 CPX XALT Neuer Punkt ist BCC DRX links von alten P.-> INC XFLAG rechts! TXA Delta ausrechnen SBC XALT JMP DR2 DRX DEC XFLAG links! SEC LDA XALT Delta her. SBC XNEU DR2 STA DELTAX Abstand merken CPY YALT neuer Punkt ist BCC DRY oberhalb alten P. INC YFLAG unterhalb TYA SBC YALT Delta berechnen JMP DR3 DRY DEC YFLAG oberhalb SEC LDA YALT Abstand (delta) SBC YNEU DR3 STA DELTAY und merken LDA XALT Neuer P.= alter P. STA XNEU LDA YALT STA YNEU LDA DELTAX welches Delta ist CMP DELTAY groesser? BCC DRYSTEP DY ist groesser-> LDA DELTAY DX ist groesser! ASL STA HILFA Naeherung fuer LDA #0 Schrittweite ROL STA HILFA+1 SUB HILFA,DELTAX,HILFT SUB HILFT,DELTAX,HILFB LDA DELTAX Zaehler fuer STA ZAEHLER Pixels einrichten DXSCHL CLC LDA XNEU X weiterzaehlen ADC XFLAG STA XNEU LDA HILFT+1 Schritt nach Y BPL DRX5 erfoderlich? Ja-> ADD HILFA,HILFT JMP DRX4 kein Schritt DRX5 CLC ADD HILFB,HILFT CLC LDA YNEU Schritt nach Y ADC YFLAG ausfuehren STA YNEU DRX4 LDX XNEU Pixel plotten LDY YNEU JSR PLOT DEC ZAEHLER ganzes Deltax BNE DXSCHL abgefahren? nein-> JMP DREND fertig !==> DRYSTEP LDA DELTAX Delta Y war groesser ASL STA HILFA Naeherung fuer LDA #0 Schritt in X-Richt. ROL STA HILFA+1 SUB HILFA,DELTAY,HILFT SUB HILFT,DELTAY,HILFB LDA DELTAY Zaehler fuer Abstand STA ZAEHLER einrichten DYSCHL CLC LDA YNEU Y weiterzaehlen ADC YFLAG STA YNEU LDA HILFT+1 Schritt nach X BPL DRY5 noetig? ja -> ADD HILFA,HILFT JMP DRY4 keine X-Korrektur DRY5 ADD HILFB,HILFT CLC LDA XNEU X-Korrektur aus- ADC XFLAG fuehren STA XNEU DRY4 LDX XNEU Pixel ausgeben LDY YNEU JSR PLOT DEC ZAEHLER alle Punkte? BNE DYSCHL nein —-> DREND LDX XNEU Ende der Linie LDY YNEU kann Anfang einer STX XALT neuen sein. STY YALT RTS fertig ! ************************************* * GRAPHICS-Unterprogramm * * Aufruf: JSR GRAPHICS * PARAMETER: * 0 bis 15 (XL/XE) * 0 bis 11 (400/800) ************************************* GRAPHICS PHA Graphik-Stufe merken LDX #$60 IOCB Nr. 6 LDA #CCLSE Screen-IOCB zuerst STA ICCOM,X schliessen JSR CIOV PLA Graphik-Stufe STA ICAX2,X zurueckholen AND #$F0 und passende EOR #$10 Bit-Kombination ORA #$0C fuer Händler STA ICAX1,X herstellen LDA #COPEN jetzt den Befehl STA ICCOM,X zum Oeffen des Screens LDA #SDEVICE Zeiger auf Device- STA ICBAL,X bezeichnung LDA #SDEVICE/256 STA ICBAH,X JSR CIOV RTS SDEVICE ASC "S:" Display-Handler ************************************* * HI-SPEED PLOT fuer Einfarb-Modi * Aufruf: JSR PLOT * * PARAMETER: * , je nach Graphikstufe * X,Y werden zerstoert! ************************************* PLOT CPY #YMAX Grenzen BCS PLOTEND pruefen CPX #XMAX BCS PLOTEND LDA ADRLO,Y Bildschirm- STA ZEIGER adresse LDA ADRHI,Y in Zeropage STA ZEIGER+1 TXA LSR ;geteilt LSR ;durch 8 LSR TAY ;Index f. X-Pos TXA ;X-Position AND #7 TAX LDA PIXTAB,X Welches Pixel EOR (ZEIGER),Y und Pixel manipulieren STA (ZEIGER),Y zurueck in Graphik PLOTEND RTS ************************************* * Erzeugt Adresstabellen fuer Plot * * muss vor der ersten Verwendung von * Plot und nach dem GRAPHICS-Befehl * stehen! ************************************* PLOTAB LDA SAVMSC Anfangsadresse STA ZEIGER des Video-Rams LDA SAVMSC+1 STA ZEIGER+1 LDY #0 Index auf 0 NXTADR LDA ZEIGER Adresstabellen STA ADRLO,Y aufbauen LDA ZEIGER+1 MSB-Tabelle STA ADRHI,Y CLC LDA ZEIGER Adresse des ADC #ZLAENGE naechsten Zeilen STA ZEIGER anfangs berechnen LDA ZEIGER+1 ADC #0 STA ZEIGER+1 INY CPY #YMAX schon f. alle Zeilen? BNE NXTADR nein — > RTS * * ab hier stehen die Tabellen * PIXTAB DFB 128,64,32,16,8,4,2,1 ADRLO ORG *+YMAX Platz fuer ADRHI ORG *+YMAX Tabellen